package com.masita.logica;

import java.sql.*;
import java.util.Vector;

import com.masita.util.Utilidad;

public class Compra{
	
	private int id_compra;
	private String fecha_compra;
	private double total;
	private double descuento;
	
	private Vector detalles;
	
	public Compra(int id_c, String fecha, double t, double desc){
		this.id_compra = id_c;
		this.fecha_compra = new String(fecha);
		this.total = t;
		this.descuento = desc;
		this.detalles = null;		
	}
	
	//METODO GET DE LA CLASE ******************************
	public double getDescuento(){
		return descuento;
	}

	public Vector getDetalles(){
		if( this.detalles == null && this.id_compra != 0 )
			this.detalles = DetalleCompra.getDetallesCompra(this.id_compra);
		return detalles;
	}

	public String getFechaCompra(){
		return fecha_compra;
	}

	public int getIdCompra(){
		return id_compra;
	}

	public double getTotal(){
		return total;
	}

	// METODO SET DE LA CLASE *****************************
	public void setDescuento(double d){
		descuento = d;
	}

	public void setDetalles(Vector vector){
		detalles = vector;
	}

	public void setFechaCompra(String string){
		fecha_compra = new String(string);
	}

	public void setTotal(double d){
		total = d;
	}
	
	// METODO ADD Y REMOVE DETALLES DE LA CLASE ***********
	public void addDetalle(DetalleCompra det){
		if( det != null ){
			if( this.getDetalles() == null ) this.detalles = new Vector();
				this.detalles.addElement(det);
				this.total += det.getMonto(); 
		}
	}
	
	public void removeDetalleVenta(DetalleCompra det){
		if( det != null ){
			if( this.getDetalles().indexOf(det) != -1 ){
				this.detalles.removeElement(det);
				this.total -= det.getMonto();
			}
		}
	}	
	// METODO ESTATICO DE LA CLASE ************************
	public static Compra getCompra(int id){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM compra WHERE id_compra = "+id;
			ResultSet rs = st.executeQuery(sentencia);
			if( rs.next() ){
				return new Compra(rs.getInt("id_compra"), 
					   rs.getString("fecha_compra"), rs.getDouble("total"),
					   rs.getDouble("descuento"));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	public static Vector getCompras(String fechaI, String fechaF){
		Vector compras = null;
		String sentencia = null;
		if( fechaI != null ){
			sentencia = "SELECT * FROM compra WHERE fecha_compra >= '"+fechaI+"' AND fecha_compra <= '"+fechaF+"'";
		}
		else{
			sentencia = "SELECT * FROM compra WHERE fecha_compra <= '"+fechaF+"'";
		}
		try{
			Statement st = Conexion.getStatement();
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( compras == null ) compras = new Vector();
				compras.addElement( new Compra(rs.getInt("id_compra"), 
					   				rs.getString("fecha_compra"),
					   				rs.getDouble("total"),
					   				rs.getDouble("descuento")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return compras;
	}
	
	// METODO QUE CREA UNA COMPRA DE UN CONJUNTO DE PEDIDOS
	public static Compra crearCompraDePedido(Vector pedidos){
		Compra compra = new Compra(0,Utilidad.getFechaHoy(),0,0);
		
		for(int i=0; i<pedidos.size(); i++){
			Pedido p = (Pedido)pedidos.elementAt(i);
			DetalleCompra detalle = new DetalleCompra(0,0,p.getIdProducto(),
									p.getIdTalle(),p.getCantidad(),0);
			compra.addDetalle(detalle);  
		}
		
		return compra;
	}
	
	// METODO GUARDAR DATOS DE LA CLASE *******************
	public int guardarDatos(){
		try{
			Statement st = Conexion.getStatement();
			String sentencia;
			
			if( this.id_compra == 0 ){
				sentencia = "INSERT INTO compra VALUES(0,'"+this.getFechaCompra()+"',"+this.total+","+
							this.descuento+")";
				st.executeUpdate(sentencia);
				ResultSet rs = st.getGeneratedKeys();
				if( rs.next() ) this.id_compra = rs.getInt(1);
			}
			else{
				sentencia = "UPDATE compra SET fecha_compra = '"+this.fecha_compra+"', total = "+this.total+
							", descuento = "+this.descuento+" WHERE id_compra = "+this.id_compra;
				st.executeUpdate(sentencia);
			}
			
			if( this.getDetalles() != null ){
				for( int i=0; i<this.detalles.size(); i++){
					DetalleCompra det = (DetalleCompra)this.detalles.elementAt(i);
					det.setIdCompra(this.id_compra);
					if( det.getIdDetalle() == 0 )
						det.registrarDetalle();
					else						
						det.guardarDatos();
				}
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return this.id_compra;
	}
	
	// METODO ELIMINAR DE LA CLASE ************************
	public boolean eliminar(){
		try{
			if( this.id_compra == 0 ) return false;
			
			Statement st = Conexion.getStatement();
			String sentencia = "DELETE FROM compra WHERE id_compra = "+this.id_compra;
			st.executeUpdate(sentencia);
			this.id_compra = 0;
			
			if( this.getDetalles() != null ){
				for( int i=0; i<this.detalles.size(); i++){
					DetalleCompra det = (DetalleCompra)this.detalles.elementAt(i);
					det.eliminar();
				}
			}
			return true;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return false;
	}
}
